home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / CMPLTPAS / GETKEY.PAS < prev    next >
Pascal/Delphi Source File  |  1988-07-24  |  3KB  |  62 lines

  1. {->>>>GetKey<<<<-----------------------------------------------}
  2. {                                                              }
  3. { Filename: GETKEY.SRC -- Last modified 7/23/88                }
  4. {                                                              }
  5. { This routine uses ROM BIOS services to test for the presence }
  6. { of a character waiting in the keyboard buffer and, if one is }
  7. { waiting, return it.  The function itself returns a TRUE      }
  8. { if a character has been read.  The character is returned in  }
  9. { Ch.  If the key pressed was a "special" (non-ASCII) key, the }
  10. { Boolean variable Extended will be set to TRUE and the scan   }
  11. { code of the special key will be returned in Scan.  In        }
  12. { addition, GETKEY returns shift status each time it is called }
  13. { regardless of whether or not a character was read.  Shift    }
  14. { status is returned as eight flag bits in byte Shifts,        }
  15. { according to the bitmap below:                               }
  16. {                                                              }
  17. {             BITS                                             }
  18. {     7  6  5  4  3  2  1  0                                   }
  19. {     1  .  .  .  .  .  .  .  INSERT      (1=Active)           }
  20. {     .  1  .  .  .  .  .  .  CAPS LOCK   (1=Active)           }
  21. {     .  .  1  .  .  .  .  .  NUM LOCK    (1=Active)           }
  22. {     .  .  .  1  .  .  .  .  SCROLL LOCK (1=Active)           }
  23. {     .  .  .  .  1  .  .  .  ALT         (1=Depressed)        }
  24. {     .  .  .  .  .  1  .  .  CTRL        (1=Depressed)        }
  25. {     .  .  .  .  .  .  1  .  LEFT SHIFT  (1=Depressed)        }
  26. {     .  .  .  .  .  .  .  1  RIGHT SHIFT (1=Depressed)        }
  27. {                                                              }
  28. { Test for individual bits using masks and the AND operator:   }
  29. {                                                              }
  30. {   IF (Shifts AND $0A) = $0A THEN CtrlAndAltArePressed;       }
  31. {                                                              }
  32. {     From: COMPLETE TURBO PASCAL 5.0  by Jeff Duntemann       }
  33. {    Scott, Foresman & Co., Inc. 1988   ISBN 0-673-38355-5     }
  34. {--------------------------------------------------------------}
  35.  
  36. FUNCTION GetKey(VAR Ch       : Char;
  37.                 VAR Extended : Boolean;
  38.                 VAR Scan     : Byte;
  39.                 Var Shifts   : Byte) : Boolean;
  40.  
  41. VAR Regs  : Registers;
  42.     Ready : Boolean;
  43.  
  44. BEGIN
  45.   Extended := False; Scan := 0;
  46.   Regs.AH := $01;     { AH=1: Check for keystroke }
  47.   Intr($16,Regs);     { Interrupt $16: Keyboard services}
  48.   Ready := (Regs.Flags AND $40) = 0;
  49.   IF Ready THEN
  50.     BEGIN
  51.       Regs.AH := 0;        { Char is ready; go read it... }
  52.       Intr($16,Regs);      { ...using AH = 0: Read Char }
  53.       Ch := Chr(Regs.AL);  { The char is returned in AL }
  54.       Scan := Regs.AH;     { ...and scan code in AH.    }
  55.       IF Ch = Chr(0) THEN Extended := True ELSE Extended := False;
  56.     END;
  57.   Regs.AH := $02;          { AH=2: Get shift/alt/ctrl status }
  58.   Intr($16,Regs);
  59.   Shifts := Regs.AL;
  60.   GetKey := Ready
  61. END;
  62.